#!/bin/bash

#
#./文件名 start 开启定时任务；./文件名 stop 停止定时任务;./文件名 run 运行脚本。
#

#上报地址
monitor_url=http://192.168.12.170/beenetic-up-bootstrap/omServer/collection

#当前文件的路径和名称,文件名和文件地址改变之后仍然可用
task_file_path=$(cd $(dirname $0);pwd);
task_file_name=$(basename $0);
#当前脚本的绝对路径
this_task_path=$task_file_path"/"$task_file_name;
#拼接定时任务字符串，第一段为定时任务调用周期；第二段为脚本文件绝对路径，run为运行脚本的参数；第三段为不显示任何信息.
task_data="*/10 * * * * "$this_task_path" run > /dev/null 2>&1"

#任务内容备份地址
task_backup="/tmp/task_backup_$USER.txt"
#当前用户任务文件配置文件地址
task_file="/var/spool/cron/"$USER

#开启定时任务
start(){
   echo "start in"
   #先删除定时任务
   stop
   #备份任务,时间,换一行,任务内容。
   #`date +"%Y-%m-%d %H:%M:%S $task_file_name start: " >> $task_backup && crontab -l >> $task_backup`
   #添加新的定时任务
   #`crontab -l > conf && echo "$task_data" >> /tmp/task_data.txt >> conf && crontab conf && rm -rf conf`
   `echo "$task_data" >> $task_file`
   echo "start out"
}

#停止定时任务
stop(){
   echo "stop in"
   #备份任务,时间,换一行,任务内容。
   `date +"%Y-%m-%d %H:%M:%S  $task_file_name: " >> $task_backup && crontab -l >> $task_backup`
   #防止文件不存在，生成文件
   echo "#"$task_file_name >> $task_file
   #删除旧的定时任务信息
   `sed -i "/.*$task_file_name/d" $task_file`
   echo "stop out"
}

#运行脚本
run(){
   echo "run in"
   
   #-------------------------------系统信息
   #ip
   # hostname -a	显示主机别名
   # hostname -d	显示DNS域名
   # hostname -f	显示FQDN名称
   # hostname -i	显示主机的ip地址
   # hostname -s	显示短主机名称，在第一个点处截断
   # hostname -y	显示NIS域名
   monitor_ip=`hostname -I`;
   monitor_ip=$(echo $monitor_ip) #删除前后空格
   echo "ip:$monitor_ip" #打印获取数据

   #操作系统
   monitor_os_name=`cat /etc/system-release`;
   monitor_os_name=$(echo $monitor_os_name) #删除前后空格
   echo "os_name:$monitor_os_name" #打印获取数据

   #系统架构
   # uname -a	显示系统所有相关信息
   # uname -m	显示计算机硬件架构
   # uname -n	显示主机名称
   # uname -r	显示内核发行版本号
   # uname -s	显示内核名称
   # uname -v	显示内核版本
   # uname -p	显示主机处理器类型
   # uname -o	显示操作系统名称
   # uname -i	显示硬件平台
   monitor_os_arch=`uname -m`;
   monitor_os_arch=$(echo $monitor_os_arch) #删除前后空格
   echo "os_arch:$monitor_os_arch" #打印获取数据
   #主机名
   monitor_host_name=`uname -n`;
   monitor_host_name=$(echo $monitor_host_name) #删除前后空格
   echo "host_name:$monitor_monitor_host_name" #打印获取数据

   #---------------------------------------------CPU信息
   #物理核心
   monitor_physical_processor=`lscpu|grep 'Core(s) per socket' | head -n1 | tr -s ' ' | cut -d : -f2`
   monitor_physical_processor=$(echo $monitor_physical_processor) #删除前后空格
   echo "physical_processor:$monitor_physical_processor" #打印获取数据
   #逻辑核心
   monitor_logicalp_rocessor=`lscpu|grep 'CPU(s)' | head -n1 | tr -s ' ' | cut -d : -f2`
   monitor_logicalp_rocessor=$(echo $monitor_logicalp_rocessor) #删除前后空格
   echo "logicalp_rocessor:$monitor_logicalp_rocessor" #打印获取数据

   #---------------------------------内存
   #-h 　以合适的单位显示内存使用情况，最大为三位数，自动计算对应的单位值
   #-b 　以Byte为单位显示内存使用情况
   #-k 　以KB为单位显示内存使用情况
   #-m 　以MB为单位显示内存使用情况
   #-o 　不显示缓冲区调节列。
   #-s<间隔秒数> 　持续观察内存使用状况。
   #-t 　显示内存总和列。
   #-V 　显示版本信息。
   #总内存
   monitor_mem_total=`free -k|grep Mem|tr -s ' ' : |cut -d : -f2`;
   monitor_mem_total=$(echo $monitor_mem_total) #删除前后空格
   echo "mem_total:$monitor_mem_total" #打印获取数据
   #使用内存
   monitor_mem_used=`free -k|grep Mem|tr -s ' ' : |cut -d : -f3`;
   monitor_mem_used=$(echo $monitor_mem_used) #删除前后空格
   echo "mem_used:$monitor_mem_used" #打印获取数据
   #空闲内存
   monitor_mem_free=`free -k|grep Mem|tr -s ' ' : |cut -d : -f4`;
   monitor_mem_free=$(echo $monitor_mem_free) #删除前后空格
   echo "mem_free:$monitor_mem_free" #打印获取数据

   #top命令执行结果
   # top -d <秒>	改变显示的更新速度
   # top -c 	切换显示模式
   # top -s	安全模式，不允许交互式指令
   # top -i	不显示任何闲置或僵死的行程
   # top -n	设定显示的总次数，完成后将会自动退出
   # top -b	批处理模式，不进行交互式显示
   monitor_top_data=`top -b -n 1|grep -E 'java|Cpu|Mem|PID'`;
   monitor_top_data=$(echo $monitor_top_data) #删除前后空格
   monitor_top_data=${monitor_top_data//\//\\} #斜杠转反斜杠，防止数据发送报错
   monitor_top_data=$(echo $monitor_top_data |base64 -i) #base64加密，防止数据发送错误
   echo $monitor_top_data > /tmp/monitor_top_data.txt
   monitor_top_data=$(cat /tmp/monitor_top_data.txt)
   #echo "top_data:$monitor_top_data" #打印获取数据

   #全部磁盘信息
   # df -a	显示所有系统文件
   # df -B <块大小>	指定显示时的块大小
   # df -h	以容易阅读的方式显示
   # df -H	以1000字节为换算单位来显示
   # df -i	显示索引字节信息
   # df -k	指定块大小为1KB
   # df -l	只显示本地文件系统
   # df -t <文件系统类型>	只显示指定类型的文件系统
   # df -T	输出时显示文件系统类型
   # df -- -sync	在取得磁盘使用信息前，先执行sync命令
   monitor_disk_data=`df -Ph`;
   monitor_disk_data=$(echo $monitor_disk_data) #删除前后空格
   monitor_disk_data=${monitor_disk_data//\//\\} #斜杠转反斜杠，防止数据发送报错
   monitor_disk_data=$(echo $monitor_disk_data |base64 -i) #base64加密，防止数据发送错误
   echo $monitor_disk_data > /tmp/monitor_disk_data.txt
   monitor_disk_data=$(cat /tmp/monitor_disk_data.txt)
   #echo "disk_data:$monitor_disk_data" #打印获取数据

   #获取内容示例
   #ip:192.168.12.102 
   #os_name:CentOS release 6.10 (Final)
   #os_arch:x86_64
   #host_name:localhost.localdomain
   #physical_package:
   #physical_processor: 1
   #logicalp_rocessor: 1
   #mem_total:1.9G
   #mem_used:1.9G
   #mem_free:71M

   #拼装数据，并发送到服务器。
   monitor_data="{\""ip\"":\""$monitor_ip\"",\""os_name\"":\""$monitor_os_name\"",\""os_arch\"":\""$monitor_os_arch\"",\""host_name\"":\""$monitor_host_name\"",\""physical_package\"":\""$monitor_physical_package\"",\""physical_processor\"":\""$monitor_physical_processor\"",\""logicalp_rocessor\"":\""$monitor_logicalp_rocessor\"",\""mem_total\"":\""$monitor_mem_total\"",\""mem_used\"":\""$monitor_mem_used\"",\""mem_free\"":\""$monitor_mem_free\"",\""top_data\"":\""$monitor_top_data\"",\""disk_data\"":\""$monitor_disk_data\""}";
   #echo $monitor_data
   echo $monitor_data > /tmp/monitor_data.txt
   monitor_data=$(cat /tmp/monitor_data.txt)
   `curl -X POST -H "Content-type:application/json" -d "$monitor_data" "$monitor_url"`
   echo "run out"
}

#接受用户输入参数，然后根据输入参数执行相关方法。
case "$1" in
   'run')
      run
      ;;
   'start')
      start
      ;;
   'stop')
      stop
      ;;
   *)
   echo "usage:$0{start|stop|run}"
   exit 1
      ;;
      esac
